<html>
<head>
<title>yGuard 2.0.3 Release Notes</title>
<style type="text/css">
<!--
body {
	font-family:Arial, Helvetica, sans-serif;
	text-align:justify;
}

code {
	color:#0000C0;
}

ul {
	list-style:disc;
	margin-top:0%;
	margin-bottom:0%;
}

ol {
	list-style:decimal;
}

p {
	margin-left:2em;
}

h1 {
	background-color:Black;
	color:White;
	text-align:center;
}
 
h2 {
	margin-top:100;
	border-top-width:0;
	border-left-width:0;
	border-bottom-width:2;
	border-right-width:0;
	border-color:Black;
	border-style:solid;
}
 
h3 {
	margin-top:50;
	border-top-width:0;
	border-left-width:0;
	border-bottom-width:2;
	border-right-width:0;
	border-color:Black;
	border-style:solid;
}
 
h4 	{
}
//-->
</style>
</head>
<body bgcolor="#f0f0f0">
<h1>yGuard 2.0.3 Release Notes</h1>

<h2>Contents</h2>
<p>
<table border="0" cellspacing="0" cellpadding="5">
  <tr>
		<td valign="top">LICENSE.html</td>
		<td><a href="LICENSE.html">yGuard Software License</a></td>
  </tr>
  <tr>
		<td valign="top">3rdPartyLicenses/</td>
		<td>3rd Party Licenses:
				<ul compact>
					<li><a href="3rdPartyLicenses/retroguard-LGPL.txt">LGPL</a> (Retroguard)<br></li>
          <li><a href="3rdPartyLicenses/retrotranslator-license.txt">Retrotranslator</a></li>
          <li><a href="3rdPartyLicenses/asm-license.txt">ASM</a></li>
        </ul></td>
  </tr>
  <tr>
		<td valign="top">README.html</td>
		<td>this file</td>
  </tr>
  <tr>
		<td valign="top">doc/</td>
		<td>documentation:
				<ul compact>
					<li><a href="doc/yguard_ant_howto.html">yGuard Ant Task documentation</a></li>
				</ul></td>
  </tr>
  <tr>
		<td valign="top">lib/</td>
		<td>ant task library:
				<ul compact>
					<li>yguard.jar</li>
				</ul></td>
  </tr>
</table>
</p>
<p>Please read the documentation for 
<a href="doc/yguard_ant_howto.html#installation">installation instructions</a>.</p>

<h2>Technical requirements</h2>
<p>yGuard requires Java2 SDK 1.4.x or greater and Ant 1.5 or greater installed on your system.
It may work with earlier versions of these pieces of software as well, however this has not 
been tested thoroughly. yGuard 1.3.x and upwards works together with Ant 1.6.</p>
<p></p>

<h2>yGuard 2.0.3 - Changes since 2.0.2</h2>
<p>
  <ul>
    <li>Fixed a bug that broke the nested <code>map</code> element of the <code>rename</code> element.</li>
  </ul>
</p>

<h2>yGuard 2.0.2 - Changes since 2.0.1</h2>
<p>
  <ul>
    <li>Fixed a bug that caused yGuard to fail during class file parsing if a method signature contained an inner class of a parameterized class.</li>
    <li>yGuard will not complain about the Java 1.5 attributes <code>Bridge</code>, <code>Enum</code> and <code>Varargs</code> as 'unknown attributes' anymore.</li>
    <li>Fixed a bug that caused all classnames to be kept from renaming if the <code>extends</code> attribute was used in combination with the <code>classes</code> attribute.</li>
  </ul>
</p>

<h2>yGuard 2.0.1 - Changes since 2.0</h2>
<p>
  <ul>
    <li>Fixed an inconsistency between the interpretation of the Ant syntax in the <code>rename</code> and <code>shrink</code> elements. Now, both elements apply <code>patternset</code> elements in nested <code>method</code> and <code>field</code> elements to class names, just as stated in the yGuard documentation.</li>
    <li>If the  <code>classes</code> attribute of the  <code>class</code> element is not set or set to  &quot;none&quot;, the shrinking engine will now include the classes that match based on the given <code>name</code> attribute or nested <code>patternset</code>, effectively ignoring the <code>classes</code> attribute.</li>
  </ul>
</p>

<h2>yGuard 2.0 - Changes since 1.5.0_03</h2>
<p>
  <ul>
    <li>New elaborate code shrinking functionality.</li>
    <li>More powerful ant syntax: <code>extends</code>/<code>implements</code> attributes for the <code>class</code> element.</li>
    <li>General Ant syntax changes due to the introduction of the new <code>yguard</code>,<code>shrink</code> and <code>rename</code> elements.</li>
    <li>yGuard now needs Java2 SDK 1.4.x or greater to function properly.</li>
  </ul>
</p>

<h2>yGuard 1.5.0_03 - Changes since 1.5.0_02</h2>
<p>
<ul>
<li>
Fixed bad treatment of the new enclosing method feature in Tiger which sometimes led to AbstractMethodErrors at runtime.
</li>
</ul>
</p>

<h2>yGuard 1.5.0_02 - Changes since 1.5.0_01</h2>
<p>
<ul>
<li>
Improved obfuscation logic for enumerations. Now the two static methods valueOf(String) and values() don't have to be exposed manually anymore.
</li>
<li>
Fixed bad annotation handling for non-trivial annotations. Annotations had not been parsed and handled correctly, which could lead to either
errors during obfuscation or Errors at runtime.
</li>
</ul>
</p>
<h2>yGuard 1.5.0_01 - Changes since 1.5</h2>
<p>
<ul>
<li>
Fixed a bug that made yGuard ignore some of the attributes in the expose section ("sourcefile" and "linenumbertable").
</li>
<li>
Fixed a rare but severe bug that accidentally removed method attributes and sometimes led to ArrayIndexOutOfBoundsExceptions
during the obfuscation.
</li>
</ul>
</p>
<h2>yGuard 1.5 - Changes since 1.3.2</h2>
<p>
<ul>
<li>
Added JDK 1.5 (a.k.a Java 5.0 code-named Tiger) compatibility. yGuard can now deal correctly with the
new JDK and Java features: generics, var-args, enumerations, annotations, new "<code>.class</code>" bytecode construct,
signatures, local variable type table, enclosing method information.
</li>
<li>
Implemented the ability to obfuscate/scramble/shrink line number information. This makes it possible to more easily debug
stacktraces without exposing line number information in the obfuscated version of the application.
</li>
<li>
Implemented the ability to obfuscate the source file information. This is necessary in order to view line number information
in stack traces. It is now possible to reassign the source file attribute inside class files so that the original source file
name is not exposed in the obfuscated application.
</li>
<li>
Added the ability to determine on a per-class basis what attributes to expose or obfuscate. This includes line number
information (with optional scrambling/compression or removal), source file attributes, deprecation attributes, etc.
This makes it easy to obfuscate parts of your application while keeping the public API untouched and debug information
for third party jars intact.
</li>
<li>
Improved the stacktrace deobfuscation tool. It can now unscramble line number information from stacktraces, features a
more polished view of the mapping rules and deobfuscates stacktraces more reliably if the stacktraces are ambiguous.
</li>
</ul>
</p>
<h2>yGuard 1.3.2 - Changes since 1.3.1_01</h2>
<p>
<ul>
<li>
Improved name generation. yGuard will now generate legal identifiers 
(with respect to <code>Character.isJavaIdentifierStart()</code>
and <code>Character.isJavaIdentifierPart(char)</code> and 
<code>Character.isIdentifierIgnorable(char)</code>) and should
therefor produce jars that should verify correctly even on older jdks
if yGuard is run using newer jdks.
</li>
<li>
yGuard now helps in the detection of duplicate class files in source jars.
In pedantic mode yGuard will terminate if duplicate classes are detected 
in different source jars. yGuard's obfuscate task will always fail if mutliple
class files containing a definition for the same jar are detected. The log file
displays useful information for finding the duplicate entries.
</li>
<li>
Improved xml log file output for Unicode characters.
</li>
<li>
Made the log file viewer output more consistent with inner class names that
were being mapped during obfuscation versus those who remained fixed.
</li>
<li>
Jar file entries are now being sorted prior to being written to the jar.
</li>
<li>
Improved handling of external classes.
</li>
<li>
    Bugfixes: 
    <ul>
    <li>Fixed a name clash problem that occurred when already obfuscated code
    was being obfuscated again using different settings. 
    </li>
    <li>
    Fixed a resolution problem concerning interfaces from external classpaths.
    </li>
    </ul>
</li>
</ul>
</p>
<h2>yGuard 1.3.1_01 - Changes since 1.3.1</h2>
<p>
<ul>
<li>
yGuard now treats the COMPATIBLE flag for the language conformity different. 
Field names and class names are now made up of lower ascii-only chars.
</li>
<li>
    Bugfixes: 
    <ul>
    <li>Fixed a problem concerning the <code>adjust</code> elements throwing
    a <code>RuntimeException</code> in the pattern matching code.
    </li>
    <li>
    Fixed a problem where the wrong set of files was affected in the <code>adjust</code>
    section.
    </li>
    </ul>
</li>
</ul>
</p>
<h2>yGuard 1.3.1 - Changes since 1.3</h2>
<p>
<ul>
<li>
yGuard will now generate (empty) directory entries in the resulting jar files for each non-empty directory.
</li>
<li>
Improved the optional keeping of "Deprecated" tags. Somehow they still seem to get lost under certain conditions.
Any feedback on this topic is welcomed.
</li>
<li>
Due to a compile time dependency, yGuard could not be used with jdk 1.3.x anymore even if the automatic
resource adjustment feature was not used. This has now been made possible again.
</li>
<li>
    Bugfixes: 
    <ul>
    <li>Fixed a rare problem that broke obfuscated code using static method 
    invocations and static field references.
    </li>
    <li>
    There was a bug in the log file viewer (<code>java -jar yguard.jar [logfile.xml[.gz]]</code>) that made it crash
    under very rare circumstances.
    </li>
    <li>
    Implemented a workaround for an Ant incompatibility problem, which resulted in yGuard behaving differently on 
    different platforms and in conjunction with different Ant versions.
    </li>
    </ul>
</li>
</ul>
</p>
<h2>yGuard 1.3 - Changes since 1.2</h2>
<p>
<ul>
<li>
    Added automatic text file and property file renaming mechanism. yGuard can
    now be configured to rename .properties files according to the obfuscation.
</li>
<li>
    It is now possible to process text files and replace occurances
    of class names with their obfuscated versions.
</li>
<li>
    One can now specify whether resource files should be kept in their original
    directory while at the same time the classes residing in the respective
    directory can be fully obfuscated to another package.
</li>
<li>
    yGuard can now automatically create gzipped (.gz) logfiles and work directly
    on compressed logfiles. This reduces the size of the logfiles drastically.
</li>
<li>
    It is now possible to simply specify a list of attributes, that should not be
    removed by yGuard (for example "<code>Deprecated</code>") using the 
    <code>expose-attributes</code> property.
</li>
<li>
    yGuard has a new name generation method (<code>language-conformity</code> = <code>compatible</code>),
    that creates jar file that <b>can</b> be successfully unzipped to the windows 
    filesystem.
</li>
<li>
    In order to avoid namespace clashes, on can now easily specify a prefix
    for completeley obfuscated package hierarchies using the <code>obfuscation-prefix</code>
    property.
</li>
<li>
    Enhanced documentation (DTD, examples, and new features description).
</li>
<li>
    Bugfixes: 
    <ul>
    <li>Innerclasses making use of the .class construct should now always be
    correctly obfuscated using the replaceClassNameStrings feature.
    </li>
    <li>
    The <code>patch</code> element had a bug concerning field name mappings, 
    which is now resolved.
    </li>
    <li>
    yGuard now tests whether a newly obfuscated name already exists in external
    jars and automatically generates names, that should not clash.
    </li>
    <li>
    yGuard should now work together with Ant version 1.6 (there was an undocumented change in the API of Ant).
    </li>
    </ul>
</li>
</ul>
</p>

<h2>yGuard 1.2 - Changes since 1.1</h2>
<p>
<ul>
<li>
    Added support for external libraries. This allows yGuard to obfuscate
    jars that have external dependencies more easily and using stronger
    obfuscation. It is now possible to specify dependencies using Ant classpath
    elements. yGuard then uses information found in these jars to resolve
    external dependencies.
</li>
<li>
    Improved error handling and task and logfile output. yGuard will now produce
    fewer unreasonable warnings. During the obfuscation run yGuard will give
    more detailed warnings and hints when unobfuscatable classes are detected.
</li>
<li>
    Added property <code>error-checking</code> which can be set to
    <code>pedantic</code>. In this case yGuard will not issue warnings but a
    build will fail instead of issueing simple warnings. This helps in finding problems.
</li>
<li>
    Fixed a minor issue. The documentation stated, that
     <pre>&lt;class classes="protected"/></pre>
    behaved like
 <pre>&lt;class classes="protected"> 
        &lt;patternset>
          &lt;include name="**.*"/>
        &lt;/patternset>
       &lt;/class></pre>
     but in the implementation <code>&lt;include name="*"/></code>
     had been applied. This has now been fixed to <code>&lt;include
     name="**.*"/></code>.
</li>
<li>
    Fixed some bugs in the documentation.
</li>
</ul>
</p>
<h2>yGuard 1.1 - Changes since 1.0.1</h2>
<p>
<ul>
<li>
    Added support for different naming schemes. These schemes result in smaller 
    jar files, better obfuscation and lead to jar files,
    which cannot be unpacked to normal filesystems.
</li>
<li>
    Fixed two JBuilder incompatibilities. Innerclasses created by JBuilder do
    not prevent yGuard from working anymore and (correct) innerclasses created
    by yGuard do not crash JBuilder anymore (which btw. is a bug in JB).
</li>
<li>
    Implemented a fix for the problem, where the <code>ClassName.class</code>
    code construct prevented classes from being obfuscated entirely.
</li>
<li>
    yGuard can now automatically obfuscate code of the form <code>
    Class.forName("com.mycompany.myapp.MyClass");
    </code> so that these classes can now be obfuscated by name, too.
</li>
<li>
    Improved the serialization of the obfuscation map to the xml file, which can
    now be parsed back in by the included tool even for complicated naming
    schemes.
</li>
<li>
    Refactored the creation of the final jar files. The current implementation
    leads to more standard conform jar files.
</li>
<li>
    Fixed two bugs concerning the handling of manifest files.
</li>
<li>
    Fixed a bug concerning the handling of the Main-Class attribute of manifest
    files.
</li>
</ul>
</p>
<h2>Changes since 1.0</h2>
<p>
<ul>
<li>
    Implemented more robust handling of Manifest files. Implementation now makes
    use of java.util.jar.Manifest. 
</li>
<li>
    The Main-Class attribute of the Manifest files will now be translated to the
    obfuscated name, if the main class is not exposed.
</li>
<li>
    The conserveManifest attribute of the obfuscate task now conserves the 
    manifest in a better way.
</li>
</ul>
</p>
</body>
</html>
